package 反射学习;

import po.Person;

import java.lang.reflect.Field;

public class Class对象的方法使用 {
    public static void main(String[] args) throws Exception {
        Class personClass = Person.class;

        //获取成员变量
        //Field[] getFields()
        //Field getField(String name)
        //Field[] getDeclaredFields()
        //Field getDeclaredField(String name)

        Field[] fields = personClass.getFields();
        for (Field field : fields) {
            //遍历获取到的成员变量们
            System.out.println(field);
        }

        System.out.println("------------");
        Field a = personClass.getField("a");

        //成员变量有2个方法,get和set
        Person p = new Person();
        p.a = "abc";
        Object o = a.get(p);
        System.out.println(o);
        //输出abc,为a变量所对应的值
        a.set(p, "张三");
        System.out.println(p.a);
        //输出张三,为a所被修改后的值

        System.out.println("------------");
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
            //获取成员方法们
            /*这个是不考虑修饰符的
            * private java.lang.String po.Person.Name
              private int po.Person.age
              public java.lang.String po.Person.a
            protected java.lang.String po.Person.b
            java.lang.String po.Person.c
            private java.lang.String po.Person.d*/
        }
        Field name = personClass.getDeclaredField("Name");
        p.setName("王五");
        //这样直接获取到的私有的成员变量会报错
        //所以要使用暴力反射
        name.setAccessible(true);
        Object o1 = name.get(p);
        System.out.println(o1);
        //输出设置的name为王五

    }
}
